/*
* Copyright 2014 Bryn Cooke
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jglue.cdiunit.internal.ejb;
import javax.ejb.EJB;
import javax.ejb.Singleton;
import javax.ejb.Stateful;
import javax.ejb.Stateless;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.event.Observes;
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.AnnotatedField;
import javax.enterprise.inject.spi.AnnotatedMethod;
import javax.enterprise.inject.spi.AnnotatedType;
import javax.enterprise.inject.spi.Extension;
import javax.enterprise.inject.spi.ProcessAnnotatedType;
import javax.enterprise.util.AnnotationLiteral;
import javax.inject.Inject;
import org.jboss.weld.literal.DefaultLiteral;
import org.apache.deltaspike.core.util.metadata.builder.AnnotatedTypeBuilder;
import org.jglue.cdiunit.internal.ejb.EJbName.EJbNameLiteral;
import org.jglue.cdiunit.internal.ejb.EJbQualifier.EJbQualifierLiteral;
public class EjbExtension implements Extension {
public <T> void processAnnotatedType(@Observes ProcessAnnotatedType<T> pat) {
boolean modified = false;
AnnotatedType<T> annotatedType = pat.getAnnotatedType();
AnnotatedTypeBuilder<T> builder = new AnnotatedTypeBuilder<T>().readFromType(annotatedType);
Stateless stateless = annotatedType.getAnnotation(Stateless.class);
if (stateless != null) {
processClass(builder, stateless.name());
modified = true;
}
Stateful stateful = annotatedType.getAnnotation(Stateful.class);
if (stateful != null) {
processClass(builder, stateful.name());
modified = true;
}
try {
Singleton singleton = annotatedType.getAnnotation(Singleton.class);
if (singleton != null) {
processClass(builder, singleton.name());
modified = true;
}
} catch (NoClassDefFoundError e) {
// EJB 3.0
}
for (AnnotatedMethod<? super T> method : annotatedType.getMethods()) {
EJB ejb = method.getAnnotation(EJB.class);
if (ejb != null) {
builder.addToMethod(method, EJbQualifierLiteral.INSTANCE);
builder.removeFromMethod(method, EJB.class);
modified = true;
if (!ejb.beanName().isEmpty()) {
builder.addToMethod(method,new EJbNameLiteral(ejb.beanName()));
} else {
builder.addToMethod(method,DefaultLiteral.INSTANCE);
}
}
}
for (AnnotatedField<? super T> field : annotatedType.getFields()) {
EJB ejb = field.getAnnotation(EJB.class);
if (ejb != null) {
modified = true;
Produces produces = field.getAnnotation(Produces.class);
if (produces == null) {
builder.addToField(field, new AnnotationLiteral<Inject>(){private static final long serialVersionUID = 1L;});
}
builder.removeFromField(field, EJB.class);
builder.addToField(field, EJbQualifierLiteral.INSTANCE);
if (!ejb.beanName().isEmpty()) {
builder.addToField(field,new EJbNameLiteral(ejb.beanName()));
} else {
builder.addToField(field, DefaultLiteral.INSTANCE);
}
}
}
if (modified) {
pat.setAnnotatedType(builder.create());
}
}
private static <T> void processClass(AnnotatedTypeBuilder<T> builder, String name ) {
builder.addToClass(new AnnotationLiteral<ApplicationScoped>(){private static final long serialVersionUID = 1L;});
builder.addToClass(EJbQualifierLiteral.INSTANCE);
if(!name.isEmpty() ) {
builder.addToClass(new EJbNameLiteral(name));
} else {
builder.addToClass(DefaultLiteral.INSTANCE);
}
}
}